#!/usr/bin/python3
# _*_ coding: utf-8 _*_
#
# Copyright (C) 2024 - 2024 heihieyouheihei, Inc. All Rights Reserved 
#
# @Time    : 2024/8/23 21:49
# @Author  : Yuyun
# @File    : leetcode_27_移除元素.py
# @IDE     : PyCharm

"""
给你一个数组 nums 和一个值 val，你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。
假设 nums 中不等于 val 的元素数量为 k，要通过此题，您需要执行以下操作：
更改 nums 数组，使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
返回 k。

示例 1：
输入：nums = [3,2,2,3], val = 3
输出：2, nums = [2,2,_,_]
解释：你的函数函数应该返回 k = 2, 并且 nums 中的前两个元素均为 2。
你在返回的 k 个元素之外留下了什么并不重要（因此它们并不计入评测）。

示例 2：
输入：nums = [0,1,2,2,3,0,4,2], val = 2
输出：5, nums = [0,1,4,0,3,_,_,_]
解释：你的函数应该返回 k = 5，并且 nums 中的前五个元素为 0,0,1,3,4。
注意这五个元素可以任意顺序返回。
你在返回的 k 个元素之外留下了什么并不重要（因此它们并不计入评测）。

提示：
0 <= nums.length <= 100
0 <= nums[i] <= 50
0 <= val <= 100
"""

"""
用户评测：

评测机将使用以下代码测试您的解决方案：

int[] nums = [...]; // 输入数组
int val = ...; // 要移除的值
int[] expectedNums = [...]; // 长度正确的预期答案。
                            // 它以不等于 val 的值排序。

int k = removeElement(nums, val); // 调用你的实现

assert k == expectedNums.length;
sort(nums, 0, k); // 排序 nums 的前 k 个元素
for (int i = 0; i < actualLength; i++) {
    assert nums[i] == expectedNums[i];
}
如果所有的断言都通过，你的解决方案将会 通过。
"""
class Solution:
    #暴力解法——遍历数组，先找出！=val值个数、再移除val、再填充数组
    def remove_num(self, nums, val):
        length = len(nums)
        k = 0
        removes = []
        for x in nums:
            if x != val:
                k += 1
            else:
                removes.append(x)
        #原素组移除val
        nums = [x for x in nums if x != val]

        # for x in removes:
        #     nums.remove(x)

        #元素组填充
        for i in range(k, length):
            nums.append(None)
        return k, nums

    #暴力解法——双层循环，1、循环遍历数组 2、循环更新数组（后面数据向前移动）
    def remove_num_I(self, nums, val):
        length = len(nums)
        i = 0
        while i < length:
            if nums[i] == val:
                # i后续元素均向前移动一位
                for j in range(i + 1, length):
                    nums[j - 1] = nums[j]
                length -= 1
                #当前第i位被重新填充，需要重新判断
                i -= 1
            i += 1
        return length, nums

    #双指针法——快慢指针
    """
 快指针：寻找新数组的元素 ，新数组就是不含有目标元素的数组
慢指针：指向更新 新数组下标的位置
"""
    def remove_num_II(self, num, val):
        length = len(nums)
        fast = 0
        slow = 0
        while fast < length:
            if nums[fast] != val:
                nums[slow] = nums[fast]
                slow += 1
            fast += 1
        return slow, nums

if __name__ == "__main__":
    nums = list(map(int, input().split(',')))
    val = int(input())
    # 必须先将类实例化，再调用函数
    # 否则，会报错missing 1 required positional argument
    solution = Solution()
    k, res = solution.remove_num_II(nums, val)
    print(k, res)